home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
-
- /* URL é≡ scheme/hostname/path/fname/query/port/anchor é╔ò¬ë≡é╖éΘ */
- int UrlSplit (char *url,
- char *scheme, char *hostname, char *path, char *fname, char *query, char *anchor,
- int *port)
- {
- char c, *s = url, *d = NULL;
- char *last_fname, *last_slash, *last_query = NULL, *last_anchor = NULL;
- char *scheme_str[]=
- {"http://", "file://"};
- short h;
-
- *query = '\0';
- *anchor = '\0';
-
- /* scheme é╔éµé┴é─ò¬è≥ */
- for (h = 0; h < sizeof (scheme_str) / sizeof (char *); h++) {
- if (!strnicmp (s, scheme_str[h], strlen (scheme_str[h])))
- break;
- }
- switch (h) {
- case 0: /* http:// */
- strcpy (scheme, "http://"); /* âfâtâHâïâgé═ HTTP */
- *port = 80;
- s += 7;
- d = hostname;
- while ((*d++ = *s++) != '/');
- *(d - 1) = '\0';
- d = path;
- *d++ = '/';
- break;
- case 1: /* file:// */
- strcpy (scheme, "file://");
- s += 7;
- *port = 0; /* ë╝é╔é▒éñé╡é╞é¡ */
- *hostname = '\0';
- d = path;
- break;
- #if 0
- case 2: /* ftp:// */
- strcpy (scheme, "ftp://");
- s += 6;
- *port = 20;
- d = hostname;
- while ((*d++ = *s++) != '/');
- *(d - 1) = '\0';
- d = path;
- *d++ = '/';
- break;
- #endif
- default:
- strcpy (scheme, "file://");
- *port = 0; /* ë╝é╔é▒éñé╡é╞é¡ */
- *hostname = '\0';
- d = path;
- break;
- }
-
-
- last_fname = s; /* ì┼îπé╠ '/' é╠ăé╠âAâhâîâXé≡ò█Ä¥üiâRâsü[î│üj */
- last_slash = d; /* ì┼îπé╠ '/' é╠ăé╠âAâhâîâXé≡ò█Ä¥üiâRâsü[ɵüj */
- for (;;) {
- c = *d++ = *s++;
- if (c == '\0') {
- if (last_query != NULL) {
- memcpy (fname, last_fname, last_query - last_fname);
- strcpy (query, last_query);
- *(fname + (last_query - last_fname)) = '\0';
- } else {
- if (last_anchor != NULL) {
- memcpy (fname, last_fname, last_anchor - last_fname);
- strcpy (anchor, last_anchor);
- *(fname + (last_anchor - last_fname)) = '\0';
- } else {
- strcpy (fname, last_fname);
- }
- }
- *last_slash = '\0';
- break;
- }
- if (c == '/') {
- last_fname = s;
- last_slash = d;
- }
- if (c == '?')
- last_query = s - 1;
- if (c == '#')
- last_anchor = s - 1;
- }
-
- return (0);
- }
-
-
- /* ùvæfé⌐éτîïìçé╡é─ URL é≡É╢ɼé╖éΘ "./" éΓ "../" éαé╡é┴é⌐éΦÅêù¥é╖éΘ */
- /* ÆAé╡ fname= "http://ü`" é╛é┴é╜ÅΩìçüAîïìçé╣é╕ url=fname é╞é╖éΘ */
- void UrlCat (char *url, /* ò╘éΦÆl */
- char *scheme, char *hostname, char *path, char *fname, char *query, char *anchor,
- int port)
- {
- char *p = fname, *q;
- char c;
- char *last_dir, *last_dir2;
-
- /* ÉΓæ╬âpâXÄwÆΦé╛é┴é╜ÅΩìç */
- if (!strnicmp (fname, "http://", 7)) {
- strcpy (url, fname);
- return;
- }
- if (!strnicmp (fname, "file://", 7)) {
- strcpy (url, fname);
- return;
- }
- /* ê╚ë║æèæ╬âpâXÄwÆΦé╠Åêù¥ */
- strcpy (url, scheme);
- if (!stricmp (scheme, "http://")) {
- if (port == 80)
- strcat (url, hostname);
- else
- sprintf (url, "http://%s:%d", hostname, port);
- }
- /* '/' é⌐éτÄné▄éΘâtâ@âCâïû╝é╛é┴é╜ÅΩìç */
- if (!strncmp (fname, "/", 1)) {
- strcat (url, fname);
- strcat (url, query);
- return;
- }
- strcat (url, path);
-
- for (;;) {
- if (!strncmp (p, "./", 2)) {
- p += 2;
- continue;
- }
- if (!strncmp (p, "../", 3)) {
- p += 3;
- q = last_dir = last_dir2 = url;
- while (c = *q++) {
- if (c == '/') {
- last_dir2 = last_dir;
- last_dir = q;
- }
- }
- *last_dir2 = '\0';
- continue;
- }
- break;
- }
- strcat (url, p);
- strcat (url, query);
- strcat (url, anchor);
- }
-
-
- #ifdef DEMO
- int main (int argc, char *argv[])
- {
- char scheme[256], hostname[256], path[256], fname[256], query[256], anchor[256];
- int port;
- char url[256];
-
- /* UrlSplit() é╠âfâé */
- printf ("UrlSplit() é╠âfâé\n");
- strcpy (url, "http://www.mankai.co.jp/denkura/123/index.htm#tools");
- UrlSplit (url, scheme, hostname, path, fname, query, anchor, &port);
- printf ("url = %s é≡ UrlSplit() é╡é▄é╖\n", url);
- printf (" scheme = %s\n"
- " hostname= %s\n"
- " path = %s\n"
- " fname = %s\n"
- " query = %s\n"
- " anchor = %s\n"
- " port = %d\n\n", scheme, hostname, path, fname, query, anchor, port);
-
- /* UrlCat() é╠âfâé */
- printf ("UrlCat() é╠âfâé\n");
- strcpy (fname, "../124/index.htm");
- strcpy (query, "?=UrlFunc");
- port = 1080;
- printf (" scheme = %s\n"
- " hostname= %s\n"
- " path = %s\n"
- " fname = %s\n"
- " query = %s\n"
- " anchor = %s\n"
- " port = %d\n"
- "é≡ UrlCat() é╡é▄é╖\n", scheme, hostname, path, fname, query, anchor, port);
- UrlCat (url, scheme, hostname, path, fname, query, anchor, port);
- printf ("url = %s\n", url);
-
- return (0);
- }
-
- #endif
-